package com.edu.exam.enums.common;

import com.edu.exam.enums.core.BaseEnum;

/**
 * 分配策略枚举
 *
 * 统一的分配策略管理，用于各种任务分配和资源分配的场景
 * 替代分散在各个实体中的重复分配策略定义
 *
 * @author System
 * @version 1.0.0
 * @since 2025-11-13
 */
public enum AssignmentStrategy implements BaseEnum {

    /**
     * 自动分配
     */
    AUTO("AUTO", "自动分配"),

    /**
     * 手动分配
     */
    MANUAL("MANUAL", "手动分配"),

    /**
     * 均衡分配
     */
    BALANCED("BALANCED", "均衡分配"),

    /**
     * 优先级分配
     */
    PRIORITY("PRIORITY", "优先级分配"),

    /**
     * 工作量均衡
     */
    WORKLOAD("WORKLOAD", "工作量均衡"),

    /**
     * 随机分配
     */
    RANDOM("RANDOM", "随机分配"),

    /**
     * 轮询分配
     */
    ROUND_ROBIN("ROUND_ROBIN", "轮询分配"),

    /**
     * 负载均衡
     */
    LOAD_BALANCED("LOAD_BALANCED", "负载均衡"),

    /**
     * 技能匹配
     */
    SKILL_BASED("SKILL_BASED", "技能匹配"),

    /**
     * 时间可用性
     */
    AVAILABILITY_BASED("AVAILABILITY_BASED", "时间可用性"),

    /**
     * 地理位置
     */
    LOCATION_BASED("LOCATION_BASED", "地理位置"),

    /**
     * 部门分配
     */
    DEPARTMENT_BASED("DEPARTMENT_BASED", "部门分配"),

    /**
     * 级别分配
     */
    LEVEL_BASED("LEVEL_BASED", "级别分配"),

    /**
     * 混合策略
     */
    HYBRID("HYBRID", "混合策略"),

    /**
     * 自定义策略
     */
    CUSTOM("CUSTOM", "自定义策略");

    private final String code;
    private final String description;

    AssignmentStrategy(String code, String description) {
        this.code = code;
        this.description = description;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDescription() {
        return description;
    }

    /**
     * 根据编码查找枚举值
     *
     * @param code 业务编码
     * @return 对应的枚举值，AUTO如果未找到
     */
    public static AssignmentStrategy fromCode(String code) {
        if (code == null || code.trim().isEmpty()) {
            return AUTO;
        }

        for (AssignmentStrategy strategy : values()) {
            if (strategy.getCode().equals(code)) {
                return strategy;
            }
        }
        return AUTO;
    }
}